﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using LumenWorks.Framework.IO.Csv;

namespace Divisionsmatch
{
    public static class Util
    {
        public static string CheckFileVersion(string filePath, out bool isStartXml, out bool isResultXml)
        {
            // xml eller csv?
            string version = string.Empty;
            XmlDocument xmlDoc = new XmlDocument();
            bool isCSV = false;
            isStartXml = false;
            isResultXml = false;

            string fileVersion = "";

            try
            {
                xmlDoc.XmlResolver = null;
                xmlDoc.Load(filePath);

                // validate
                XmlNodeList rootNodes = xmlDoc.GetElementsByTagName("StartList");
                if (rootNodes != null && rootNodes.Count == 1)
                {
                    isStartXml = true;
                }
                else
                {
                    rootNodes = xmlDoc.GetElementsByTagName("ResultList");
                    if (rootNodes != null && rootNodes.Count == 1)
                    {
                        isResultXml = true;
                    }

                    //// throw new Exception("Dette er vist hverken en startliste eller en resultatliste");
                }

                if (isStartXml || isResultXml)
                {
                    // find ud af hvilken version vi har med at gøre
                    XmlAttribute iofVersion = rootNodes[0].Attributes["iofVersion"];
                    if (iofVersion == null)
                    {
                        XmlNodeList iofNodes = xmlDoc.GetElementsByTagName("IOFVersion");
                        if (iofNodes != null && iofNodes.Count == 1)
                        {
                            iofVersion = iofNodes[0].Attributes["version"];
                        }
                    }
                    if (iofVersion != null)
                    {
                        version = iofVersion.Value;
                    }
                }
            }
            catch
            {
                // vi antager det er en csv-fil
                isCSV = true;
            }

            if (isCSV)
            {
                fileVersion = "csv";
            }
            else if (isStartXml || isResultXml)
            {
                if (version == "3.0")
                {
                    fileVersion = "xml3";
                }
                else if (version == "2.0.3")
                {
                    fileVersion = "xml2";
                }
            }

            return fileVersion;
        }

        public static IList<Loeber> ReadRunnersFromCsv(string filnavn, Config config, List<Klub> klubber)
        {
            string msg = string.Empty;

            IList<Loeber> loebere = new List<Loeber>();

            // find løbere og tilføj dem til gruppen
            // open the file "data.csv" which is a CSV file with headers
            using (CsvReader csv = new CsvReader(new StreamReader(filnavn, ASCIIEncoding.Default), false, ';'))
            {
                if (csv.FieldCount < 43)
                {
                    msg += "det er vist ikke en csv-fil...\n";
                }
                else
                {
                    // csv.MissingFieldAction = MissingFieldAction.ReplaceByNull;

                    csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;
                    csv.DefaultParseErrorAction = ParseErrorAction.AdvanceToNextLine;

                    // treat header
                    csv.ReadNextRecord();

                    int idxStartnr = 0;
                    int idxEfternavn = 3;
                    int idxFornavn = 4;
                    int idxStartTid = 9;
                    int idxTid = 11;
                    int idxStatus = 12;
                    int idxKlub = 15;
                    int idxKlasse = 18;
                    int idxPl = 43;
                    if (csv[0].StartsWith("OE"))
                    {
                        idxStartnr = 1;
                        idxEfternavn = 5;
                        idxFornavn = 6;
                        idxStartTid = 11;
                        idxTid = 13;
                        idxStatus = 14;
                        idxKlub = 20;
                        idxKlasse = 25;
                        idxPl = 57;
                    }

                    while (csv.ReadNextRecord())
                    {
                        try
                        {
                            // løberen må have en klasse som bruges i matchen
                            var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == csv[idxKlasse]);
                            //if (gk != null)
                            //{
                                Loeber l = new Loeber();
                                l.stnr = csv[idxStartnr]; //"startnr"];
                                l.fornavn = csv[idxFornavn]; //"fornavn"];
                                l.efternavn = csv[idxEfternavn]; // "efternavn"];
                                string klub = string.IsNullOrWhiteSpace(csv[idxKlub]) ? csv[idxKlub - 1] : csv[idxKlub]; // klub city eller navn
                                l.klub = klubber.Find(item => item.navn.Equals(klub));//"klub"
                                if (l.klub == null)
                                {
                                    // add a temporay klub for runners outside the match
                                    l.klub = new Klub(klub);
                                }
                                l.løbsklassenavn = csv[idxKlasse];
                                l.gruppeklasse = (gk != null) ? gk.Klasse : string.Empty;
                                l.placering = csv[idxPl]; //"pl"];
                                l.tid = _lavtid(csv[idxTid]); //"tid"];
                                l.status = csv[idxStatus]; //"status"];
                                l.StartTid = _lavtid(csv[idxStartTid], config.StartTid);

                                loebere.Add(l);
                            //}
                        }
                        catch
                        {
                            msg += "linje: " + csv.CurrentRecordIndex + "\n";
                        }
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af csv-data: \n" + msg);
            }

            return loebere;
        }

        public static IList<Loeber> ReadRunnersFromResultXML2(string filnavn, Config config, List<Klub> klubber)
        {
            string msg = string.Empty;

            IList<Loeber> loebere = new List<Loeber>();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.Load(filnavn);

            XmlNodeList classNodes = xmlDoc.GetElementsByTagName("ClassResult");
            foreach (XmlElement classNode in classNodes)
            {
                // class detail
                string classtext = string.Empty;
                XmlNodeList classes = classNode.GetElementsByTagName("ClassShortName");
                if (classes.Count > 0)
                {
                    classtext = classNode.GetElementsByTagName("ClassShortName")[0].InnerText;
                }

                // deltagere
                foreach (XmlElement personResult in classNode.GetElementsByTagName("PersonResult"))
                {
                    // person details
                    XmlElement person = personResult.GetElementsByTagName("Person")[0] as XmlElement;
                    XmlElement personName = person.GetElementsByTagName("PersonName")[0] as XmlElement;

                    string efternavn = personName.GetElementsByTagName("Family")[0].InnerText;
                    string fornavn = personName.GetElementsByTagName("Given")[0].InnerText;

                    // club details
                    XmlElement club = personResult.GetElementsByTagName("Club")[0] as XmlElement;
                    string klubnavn = (club != null) ? club.GetElementsByTagName("ShortName")[0].InnerText : string.Empty;

                    // time details
                    XmlElement result = personResult.GetElementsByTagName("Result")[0] as XmlElement;
                    XmlNodeList resultTimes = result.GetElementsByTagName("Time");
                    string tid = string.Empty;
                    if (resultTimes.Count > 0)
                    {
                        tid = resultTimes[0].InnerText;
                    }

                    string placering = string.Empty;
                    XmlNodeList resultPositions = result.GetElementsByTagName("ResultPosition");
                    if (resultPositions.Count > 0)
                    {
                        placering = resultPositions[0].InnerText;
                    }
                    string status = result.GetElementsByTagName("CompetitorStatus")[0].Attributes["value"].Value;

                    try
                    {
                        // løberen må have en klasse som bruges i matchen
                        var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == classtext);
                        if (gk != null)
                        {
                            Loeber l = new Loeber();
                            l.stnr = "0"; //""];
                            l.fornavn = fornavn; //"fornavn"];
                            l.efternavn = efternavn; // "efternavn"];
                            l.klub = klubber.Find(item => item.navn.Equals(klubnavn));//"klub"
                            if (l.klub == null)
                            {
                                // add a temporay klub for runners outside the match
                                l.klub = new Klub(klubnavn);
                            }
                            l.løbsklassenavn = classtext;
                            l.gruppeklasse = gk.Klasse;
                            l.placering = placering; //"pl"];
                            l.tid = _lavtid(tid); //"tid"];
                            l.status = status; //"status"];

                            loebere.Add(l);
                        }
                    }
                    catch
                    {
                        msg += "løber: " + fornavn + " " + efternavn + " kunne ikke tilføjes\n";
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af xml-data: \n" + msg);
            }
            return loebere;
        }

        public static IList<Loeber> ReadRunnersFromResultXML3(string filnavn, Config config, List<Klub> klubber)
        {
            string msg = string.Empty;
            IList<Loeber> loebere = new List<Loeber>();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.Load(filnavn);

            XmlNodeList classNodes = xmlDoc.GetElementsByTagName("ClassResult");
            foreach (XmlElement classNode in classNodes)
            {
                // class detail
                string classtext = (classNode.GetElementsByTagName("Class")[0] as XmlElement).GetElementsByTagName("Name")[0].InnerText;

                foreach (XmlElement personResult in classNode.GetElementsByTagName("PersonResult"))
                {
                    // person details
                    XmlElement person = personResult.GetElementsByTagName("Person")[0] as XmlElement;
                    XmlElement personName = person.GetElementsByTagName("Name")[0] as XmlElement;

                    string efternavn = personName.GetElementsByTagName("Family")[0].InnerText;
                    string fornavn = personName.GetElementsByTagName("Given")[0].InnerText;

                    // club details
                    XmlElement club = personResult.GetElementsByTagName("Organisation")[0] as XmlElement;
                    string klubnavn = (club != null) ? club.GetElementsByTagName("Name")[0].InnerText : "";

                    // time details
                    XmlElement result = personResult.GetElementsByTagName("Result")[0] as XmlElement;

                    XmlNodeList resultTimes = result.GetElementsByTagName("Time");
                    string tid = string.Empty;
                    if (resultTimes.Count > 0)
                    {
                        tid = resultTimes[0].InnerText;
                    }

                    string placering = string.Empty;
                    XmlNodeList resultPositions = result.GetElementsByTagName("Position");
                    if (resultPositions.Count > 0)
                    {
                        placering = resultPositions[0].InnerText;
                    }

                    string status = string.Empty;
                    XmlNodeList resultStatus = result.GetElementsByTagName("Status");
                    if (resultStatus.Count > 0)
                    {
                        status = resultStatus[0].InnerText;
                    }

                    try
                    {
                        // løberen må have en klasse som bruges i matchen
                        var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == classtext);

                        Loeber l = new Loeber();
                        l.stnr = "0"; //""];
                        l.fornavn = fornavn; //"fornavn"];
                        l.efternavn = efternavn; // "efternavn"];
                        l.klub = klubber.Find(item => item.navn.Equals(klubnavn));//"klub"
                        if (l.klub == null)
                        {
                            // add a temporay klub for runners outside the match
                            l.klub = new Klub(klubnavn);
                        }
                        l.løbsklassenavn = classtext;
                        l.gruppeklasse = gk != null ? gk.Klasse : string.Empty;
                        l.placering = placering; //"pl"];
                        l.tid = _lavtid(tid); //"tid"];
                        l.status = status; //"status"];

                        loebere.Add(l);
                    }
                    catch
                    {
                        msg += "løber: " + fornavn + " " + efternavn + "\n";
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af xml-data: \n" + msg);
            }

            return loebere;
        }

        public static IList<Loeber> ReadRunnersFromStartCsv(string filnavn, Config config, List<Klub> klubber)
        {
            return ReadRunnersFromCsv(filnavn, config, klubber);
        }

        public static IList<Loeber> ReadRunnersFromStartlistXML2(string filnavn, Config config, List<Klub> klubber)
        {
            string msg = string.Empty;

            IList<Loeber> loebere = new List<Loeber>();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.Load(filnavn);

            XmlNodeList classNodes = xmlDoc.GetElementsByTagName("ClassStart");
             if (classNodes.Count == 0)
            {
                throw new Exception("Dette er ikke en fil med startliste data");
            }
           foreach (XmlElement classNode in classNodes)
            {
                // class detail
                string classtext = string.Empty;
                XmlNodeList classes = classNode.GetElementsByTagName("ClassShortName");
                if (classes.Count > 0)
                {
                    classtext = classNode.GetElementsByTagName("ClassShortName")[0].InnerText;
                }

                // deltagere
                foreach (XmlElement personStart in classNode.GetElementsByTagName("PersonStart"))
                {
                    // person details
                    XmlElement person = personStart.GetElementsByTagName("Person")[0] as XmlElement;
                    XmlElement personName = person.GetElementsByTagName("PersonName")[0] as XmlElement;

                    string efternavn = personName.GetElementsByTagName("Family")[0].InnerText;
                    string fornavn = personName.GetElementsByTagName("Given")[0].InnerText;

                    // club details
                    XmlElement club = personStart.GetElementsByTagName("Club")[0] as XmlElement;
                    string klubnavn = (club != null) ? club.GetElementsByTagName("ShortName")[0].InnerText : string.Empty;

                    // start details
                    string tid = string.Empty;
                    XmlElement start = personStart.GetElementsByTagName("StartTime")[0] as XmlElement;
                    if (start != null)
                    {
                        XmlNodeList startTime = start.GetElementsByTagName("Clock");
                        if (startTime !=null && startTime.Count > 0)
                        {
                            tid = startTime[0].InnerText;
                        }
                    }

                    try
                    {
                        // løberen må have en klasse som bruges i matchen
                        var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == classtext);
                        if (gk != null)
                        {
                            Loeber l = new Loeber();
                            l.stnr = "0"; //""];
                            l.fornavn = fornavn; //"fornavn"];
                            l.efternavn = efternavn; // "efternavn"];
                            l.klub = klubber.Find(item => item.navn.Equals(klubnavn));//"klub"
                            if (l.klub == null)
                            {
                                // add a temporay klub for runners outside the match
                                l.klub = new Klub(klubnavn);
                            }
                            l.løbsklassenavn = classtext;
                            l.gruppeklasse = gk.Klasse;
                            l.StartTid = _lavtid(tid); //"tid"];                            

                            loebere.Add(l);
                        }
                    }
                    catch
                    {
                        msg += "løber: " + fornavn + " " + efternavn + " kunne ikke tilføjes\n";
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af xml-data: \n" + msg);
            }
            return loebere;
        }

        public static IList<Loeber> ReadRunnersFromStartlistXML3(string filnavn, Config config, List<Klub> klubber)
        {
            string msg = string.Empty;
            IList<Loeber> loebere = new List<Loeber>();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.Load(filnavn);

            XmlNodeList classNodes = xmlDoc.GetElementsByTagName("ClassStart");
            if (classNodes.Count == 0)
            {
                throw new Exception("Dette er ikke en fil med startliste data");
            }
            foreach (XmlElement classNode in classNodes)
            {
                // class detail
                string classtext = (classNode.GetElementsByTagName("Class")[0] as XmlElement).GetElementsByTagName("Name")[0].InnerText;

                foreach (XmlElement personStart in classNode.GetElementsByTagName("PersonStart"))
                {
                    // person details
                    XmlElement person = personStart.GetElementsByTagName("Person")[0] as XmlElement;
                    XmlElement personName = person.GetElementsByTagName("Name")[0] as XmlElement;

                    string efternavn = personName.GetElementsByTagName("Family")[0].InnerText;
                    string fornavn = personName.GetElementsByTagName("Given")[0].InnerText;

                    // club details
                    XmlElement club = personStart.GetElementsByTagName("Organisation")[0] as XmlElement;
                    string klubnavn = (club != null) ? club.GetElementsByTagName("Name")[0].InnerText : "";

                    // time details
                    string tid = string.Empty;
                    XmlElement start = personStart.GetElementsByTagName("Start")[0] as XmlElement;
                    if (start != null)
                    {
                        XmlElement startTime = start.GetElementsByTagName("StartTime")[0] as XmlElement;
                        if (startTime != null)
                        {
                            tid = startTime.InnerText;
                        }
                    }
                    try
                    {
                        // løberen må have en klasse som bruges i matchen
                        var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == classtext);
                        if (gk != null)
                        {
                            Loeber l = new Loeber();
                            l.stnr = "0"; //""];
                            l.fornavn = fornavn; //"fornavn"];
                            l.efternavn = efternavn; // "efternavn"];
                            l.klub = klubber.Find(item => item.navn.Equals(klubnavn));//"klub"
                            if (l.klub == null)
                            {
                                // add a temporay klub for runners outside the match
                                l.klub = new Klub(klubnavn);
                            }
                            l.løbsklassenavn = classtext;
                            l.gruppeklasse = gk.Klasse;
                            l.StartTid = _lavtid(tid); //"tid"];
                            
                            loebere.Add(l);
                        }
                    }
                    catch
                    {
                        msg += "løber: " + fornavn + " " + efternavn + "\n";
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af xml-data: \n" + msg);
            }

            return loebere;
        }

        public static string BaneStartListe(bool isTxt, bool includeAll, IList<Loeber> loebere, Config config)
        {
            StringBuilder sb = new StringBuilder();
            if (isTxt)
            {
                sb.AppendLine("Start liste");
                sb.AppendLine("===========");
                sb.AppendLine();
                foreach (Bane b in config.baner.OrderBy(bb => bb.Navn))
                {
                    var kl = config.classes.Where(k => k.Bane != null && k.Bane.Navn.Equals(b.Navn)).Select(kk => kk.Navn);
                    // find løbere på samme bane - og vælg dem i matchen, eller alle
                    var lll = loebere.Where(l => kl.Contains(l.løbsklassenavn) && (includeAll || config.selectedClubs.Contains(l.klub.navn))).ToList();
                    if (lll.Count > 0)
                    {
                        sb.AppendLine();
                        sb.AppendLine("Bane " + b.Navn);
                        sb.AppendLine("--------------");
                        sb.Append(txtTable(lll.OrderBy(l => l.StartTid).ToList()));
                    }
                }
            }
            else
            {
                sb.AppendLine("<html>");
                sb.AppendLine("<body>");
                sb.AppendLine("<h1>Startliste</h1>");

                foreach (Bane b in config.baner.OrderBy(bb => bb.Navn))
                {
                    var kl = config.classes.Where(k => k.Bane != null && k.Bane.Navn.Equals(b.Navn)).Select(kk => kk.Navn);
                    // find løbere på samme bane - og alle
                    var lll = loebere.Where(l => kl.Contains(l.løbsklassenavn) && (includeAll || config.selectedClubs.Contains(l.klub.navn))).ToList();
                    if (lll.Count > 0)
                    {
                        sb.AppendLine("<h3>Bane " + b.Navn + "</h3>");
                        sb.Append(htmlTable(b.Navn, lll.OrderBy(l => l.StartTid).ToList()));
                    }
                }

                sb.AppendLine("</body>");
                sb.AppendLine("</html>");
            }

            return sb.ToString();
        }

        public static string GruppeStartListe(bool isTxt, bool includeAll, IList<Loeber> loebere, Config config)
        {
            List<Gruppe> grupper = new List<Gruppe>();
            foreach (GruppeOgKlasse gk in config.gruppeOgKlasse) //.Where(item => item.LøbsKlasse.Trim() != "-" && item.LøbsKlasse.Trim() != string.Empty))
            {
                if (gk.LøbsKlasse != null && gk.LøbsKlasse.Trim() != "-" && gk.LøbsKlasse.Trim() != string.Empty)
                {
                    Gruppe g = grupper.Find(item => item.navn == gk.Gruppe);
                    if (g == null)
                    {
                        // lav gruppen
                        g = new Gruppe(gk.Gruppe, 0);
                        grupper.Add(g);
                    }

                    // tilføj klasse definitionen
                    if (!g.klasser.Exists(k => k.LøbsKlasse != null && k.LøbsKlasse.Navn.Equals(gk.LøbsKlasse)))
                    {
                        Klasse kk = config.classes.Find(c => c.Navn == gk.LøbsKlasse);
                        g.klasser.Add(new klasseconfig(gk.Klasse, kk, gk.Ungdom));
                    }
                }
            }

            StringBuilder sb = new StringBuilder();
            if (isTxt)
            {
                sb.AppendLine("Start liste");
                sb.AppendLine("===========");
                sb.AppendLine();
                foreach (Gruppe g in grupper)
                {
                    var kl = config.gruppeOgKlasse.Where(gk => gk.Gruppe == g.navn).ToList().ConvertAll(kg => kg.LøbsKlasse);
                    var lll = loebere.Where(l => kl.Contains(l.løbsklassenavn) && (includeAll || config.selectedClubs.Contains(l.klub.navn))).ToList();
                    if (lll.Count > 0)
                    {
                        sb.AppendLine();
                        sb.AppendLine("Gruppe " + g.navn);
                        sb.AppendLine("--------------");
                        sb.AppendLine(txtTable(lll.OrderBy(l => l.StartTid).ToList()));
                    }
                }
            }
            else
            {
                sb.AppendLine("<html>");
                sb.AppendLine("<body>");
                sb.AppendLine("<h1>Startliste</h1>");
                foreach (Gruppe g in grupper)
                {
                    var kl = config.gruppeOgKlasse.Where(gk => gk.Gruppe == g.navn).ToList().ConvertAll(kg => kg.LøbsKlasse);
                    var lll = loebere.Where(l => kl.Contains(l.løbsklassenavn) && (includeAll || config.selectedClubs.Contains(l.klub.navn))).ToList();
                    if (lll.Count > 0)
                    {
                        sb.AppendLine("<h3>Gruppe " + g.navn + "</h3>");
                        sb.AppendLine(htmlTable(g.navn, lll.OrderBy(l => l.StartTid).ToList()));
                    }
                }
                sb.AppendLine("</body>");
                sb.AppendLine("</html>");
            }

            return sb.ToString();
        }

        private static string _lavtid(string t, string starttid)
        {
            string nytid = _lavtid(t);
            if (starttid != "00:00:00")
            {
                string[] arrTid = nytid.Split(':');
                nytid = DateTime.Parse(starttid).Add(TimeSpan.Parse(nytid)).ToString("HH:mm:ss");
            }

            return nytid;
        }

        private static string _lavtid(string t)
        {
            string nytid = t;

            if (t.IndexOf("T") >= 0)
            {
                t = t.Substring(t.IndexOf("T")+1);
            }

            if (t.IndexOf("+") >= 0)
            {
                t = t.Substring(0,t.IndexOf("+"));
            }

            if (t.IndexOf("Z") >= 0)
            {
                t = t.Substring(0, t.IndexOf("Z"));
            }

            // fjern evt decimalsekunder
            if (t.IndexOf(",") >= 0)
            {
                t = t.Substring(0, t.IndexOf(","));
            }
            if (t.IndexOf(".") >= 0)
            {
                t = t.Substring(0, t.IndexOf("."));
            }

            string[] timeparts = t.Split(':');
            if (timeparts.Length == 1)
            {
                if (!t.Trim().Equals(string.Empty))
                {
                    // antag at det er antal sekunder
                    int secs = 0;
                    if (Int32.TryParse(t, out secs))
                    {
                        TimeSpan ts = new TimeSpan(secs * 10000000L);
                        nytid = string.Format("{0:c}", ts);
                    }
                }
            }
            else if (timeparts.Length == 2)
            {
                // antag at det er minutter og sekunder
                nytid = "00:" + t.PadLeft(5, '0');
            }
            else if (timeparts.Length == 3)
            {
                // foranstil med nuller
                nytid = t.PadLeft(8, '0');
            }

            return nytid;
        }

        private static string txtTable(IList<Loeber> loebere)
        {
            StringBuilder output = new StringBuilder();

            output.Append("Navn                    Klub            Klasse    Starttid  ");
            output.AppendLine();

            int cnt = 0;
            foreach (var l in loebere) // print onlu included runners
            {
                cnt++;
                //Loeber l = kv.Value;
                string line = string.Empty;
                line += (l.fornavn + " " + l.efternavn).PadRight(24).Substring(0, 24);
                line += l.klub.navn.PadRight(15).Substring(0, 15);
                line += " ";
                line += l.løbsklassenavn.PadRight(7).Substring(0, 7);
                line += "   " + l.StartTid;
                output.AppendLine(line);
            }

            output.AppendLine();

            return output.ToString();
        }

        private static string htmlTable(string navn, IList<Loeber> loebere)
        {
            StringBuilder output = new StringBuilder();

            output.AppendLine("<table class=\"bane\" id=\"" + navn + "\">");
            output.Append("<thead class=\"bane\"><tr class=\"bane\"><th class='bane'>Navn</th><th class='bane'>Klub</th><th class='bane'>Klasse</th><th class='bane'>Starttid</th>");
            output.AppendLine("</tr></thead>");
            output.AppendLine("<tbody>");

            int cnt = 0;
            foreach (var l in loebere)
            {
                cnt++;
                // Loeber l = kv.Value;
                string line = "<tr class='bane'>";
                line += "<td class='bane' nowrap>" + l.fornavn + " " + l.efternavn + "</td>";
                line += "<td class='bane' nowrap>" + l.klub.navn + "</td>";
                line += "<td class='bane'>" + l.løbsklassenavn + "</td>";
                line += "<td class='bane'>" + l.StartTid + "</td>";
                line += "</tr>";

                output.AppendLine(line);
            }

            output.AppendLine("</tbody>");
            output.AppendLine("</table>");

            return output.ToString();
        }

    }
}
